package mx.ipn.escom.redes.gestionarempleado.dao;

import java.util.List;

import javax.inject.Named;
import javax.inject.Singleton;

import mx.ipn.escom.redes.equipo.model.Empleado;
import mx.ipn.escom.redes.equipo.model.Perfil;

import org.hibernate.Query;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;

@Singleton
@Named("empleadoDao")
public class EmpleadoDao extends HibernateDaoSupport {
	
	private static final String UNICIDAD_NOMBRE = "FROM Empleado where nombre = :name";
	
	public List<Empleado> findAll() {
		return getHibernateTemplate().loadAll(Empleado.class);
	}
	
	public List<Perfil> findAllPerfil(){
		return getHibernateTemplate().loadAll(Perfil.class);
	}
	
	public Empleado findById(Integer id){
		return getHibernateTemplate().get(Empleado.class, id);
	}
	
	public List<Empleado> findByExample(Empleado entidad){
		return getHibernateTemplate().findByExample(entidad);
	}
	
	public Empleado save(Empleado entidad){
		Empleado entidadAux = getHibernateTemplate().merge(entidad);
		getHibernateTemplate().save(entidadAux);
		return entidadAux;
	}
	
	public Empleado update(Empleado entidad){
		Empleado entidadAux = getHibernateTemplate().merge(entidad);
		getHibernateTemplate().update(entidadAux);
		return entidadAux;
	}
	
	public Empleado delete(Empleado entidad){
		Empleado entidadAux = getHibernateTemplate().merge(entidad);
		getHibernateTemplate().refresh(entidadAux);
		getHibernateTemplate().delete(entidadAux);
		return entidadAux;
	}
	
	@SuppressWarnings("unchecked")
	@Transactional
	public boolean isNombreRepetido(String nombre){
		Query query = getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(UNICIDAD_NOMBRE);
		query.setString("name", nombre);
		List<Empleado> list = query.list();
		if(list.isEmpty()){
			return true;
		}
		return false;
	}
	
	@Transactional
	public Empleado findByEmailPassword(String email, String password) {
		Empleado empleado = new Empleado();
		empleado.setEmail(email);
		empleado.setPassword(password);
		return !(getHibernateTemplate().findByExample(empleado).isEmpty()) ? (Empleado) getHibernateTemplate()
				.findByExample(empleado).get(0) : null;
	}
}
